home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 54200 / 54200.xpi / chrome / dogood.jar / content / DoGoodReplace.js < prev    next >
Text File  |  2010-01-05  |  14KB  |  414 lines

  1. /**
  2.  *
  3.  * Base script for find banners and replace them.
  4.  *
  5.  */
  6.  
  7. const rCc = Components.classes;
  8. const rCi = Components.interfaces;
  9.  
  10. const rLoader = rCc["@mozilla.org/moz/jssubscript-loader;1"].getService(rCi.mozIJSSubScriptLoader);
  11.  
  12. rLoader.loadSubScript('chrome://dogood/content/DoGoodCookie.js');
  13. rLoader.loadSubScript('chrome://dogood/content/DoGoodFilters.js');
  14. rLoader.loadSubScript('chrome://dogood/content/DoGoodReplaceRules.js');
  15. rLoader.loadSubScript('chrome://dogood/content/DoGoodContextMenu.js');
  16.  
  17. /**
  18.  * Class replace.
  19.  * Contains methods for searching and replacing banners.
  20.  */
  21.  
  22. const DoGoodReplace = {
  23.  
  24.     /**
  25.      * Address of ads server
  26.      *
  27.      * @type String
  28.      */
  29.       adsserver    : 'http://ads.dogoodhq.com/',
  30.       
  31.     /**
  32.      * Address of face server
  33.      *
  34.      * @type String
  35.      */
  36.       faceserver    : 'http://u.dogoodhq.com/',
  37.       
  38.     /**
  39.      * Count of hits for the current session
  40.      *
  41.      * @type Int
  42.      */
  43.     currentCount: null,
  44.     
  45.     /**
  46.      * Id of current session
  47.      *
  48.      * @type Int
  49.      */
  50.     sessionId    : new Date().getTime(),
  51.  
  52.     /**
  53.      * Current version
  54.      *
  55.      * @type String
  56.      */
  57.     version        : '1.0.3',
  58.     
  59.     /**
  60.      * Function for search image banners. 
  61.      *
  62.      * @param {object} doc - current loaded document  
  63.      */
  64.     imageBannersSearch : function(doc) {
  65.         if (!doc) doc = window.content.document;                //if not document, get document current page
  66.         var imgs = doc.images;
  67.         var l = 0;
  68.         var len = imgs.length;
  69.  
  70.         while (l < len) {
  71.             if (imgs[l].parentNode.tagName.toLowerCase() == 'a') {   //if <img> object in <a> object
  72.                 var a = imgs[l].parentNode;
  73.                 var w = imgs[l].naturalWidth || imgs[l].width || imgs[l].offsetWidth;
  74.                 var h = imgs[l].naturalHeight || imgs[l].height || imgs[l].offsetHeight;
  75.                 var iname = w + "x" + h;
  76.  
  77.                 // if object <a> is not replaced and href in filter list (or src of <img> in filter list)
  78.                 if (DoGoodRules.newimages[iname] && !a.backsrc && (DoGoodFilter.RegExpFilter(a.href) || DoGoodFilter.RegExpFilter(imgs[l].src))) {
  79.                     DoGoodReplace.createBanner(doc, a, a.parentNode, 'image', w, h);
  80.                 } 
  81.             }
  82.             l++;
  83.         };
  84.         DoGoodReplace.objectBannersSearch(doc);       //go to search all other objects
  85.     },
  86.     
  87.     /**
  88.      * Function for search embed, object and iframe banners.
  89.      *
  90.      * @param {object} doc - current loaded document  
  91.      */
  92.     objectBannersSearch : function (doc) {
  93.         DoGoodReplace.collectionOverlay(doc, doc.embeds, "embed", "src");                                // check all embed objects
  94.         DoGoodReplace.collectionOverlay(doc, doc.getElementsByTagName('object'), "object", "data");    // check all <object> objects
  95.         //if (!doc.defaultView.frameElement) {                                // and if loaded root document, check all iframes
  96.             DoGoodReplace.collectionOverlay(doc, doc.getElementsByTagName('iframe'), "iframe", "src"); 
  97.         //}
  98.     },
  99.     
  100.     /**
  101.      * Function for overlay collection objects.
  102.      *
  103.      * @param {object} doc - current loaded document  
  104.      * @param {objects collection} collection - collection of objects  
  105.      * @param {string} type - type of objects
  106.      * @param {string} attr - attribute of object for filter check
  107.      */
  108.     collectionOverlay : function(doc, collection, type, attr) {
  109.             var i = 0;
  110.             var len = collection.length;
  111.             while (i < len) {
  112.                 var obj = collection[i];
  113.                 var w = obj.width;
  114.                 var h = obj.height;
  115.                 if (!w) {
  116.                     w = obj.style.width;
  117.                     if (w.indexOf('px') != -1) w = w.substr(0, w.indexOf('px'));
  118.                     h = obj.style.height;
  119.                     if (h.indexOf('px') != -1) h = h.substr(0, h.indexOf('px'));
  120.                 }
  121.                 var iname = w + "x" + h;
  122.                 var link = obj.getAttribute(attr);
  123.                 
  124.                 if ((obj.id != "DoGoodObject") && DoGoodRules.newimages[iname] && DoGoodReplace.objectIsBanner(obj, type, link)) {
  125.                     var prObj = DoGoodReplace.getObjectAndParent(obj, type);
  126.                     
  127.                     DoGoodReplace.createBanner(doc, prObj.obj, prObj.pr, type, w, h);
  128.                     if (type == 'iframe') { len--; } else { i++; }
  129.                 } else {
  130.                     i++;
  131.                 } 
  132.             }
  133.     },
  134.  
  135.     /**
  136.      * Function to check specific features of object
  137.      *
  138.      * @param {object} obj - current object  
  139.      * @param {string} type - type of objects
  140.      * @param {string} link - link for filter check
  141.      */
  142.     objectIsBanner : function(obj, type, link) {
  143.         switch (type)
  144.         {
  145.             case "embed":
  146.                 var clickTag = false;
  147.                 var flashvars = obj.getAttribute("flashvars");
  148.                 if (flashvars) {
  149.                     if ((flashvars.toLowerCase().indexOf('clicktag') != -1) || (flashvars.toLowerCase().indexOf('clickurl') != -1)) {
  150.                         clickTag = true;
  151.                     }
  152.                 }
  153.                 var src = obj.getAttribute("src");
  154.                 if ((src.toLowerCase().indexOf('clicktag') != -1) || (src.toLowerCase().indexOf('clickurl') != -1)) {
  155.                         clickTag = true;
  156.                 }
  157.                   if ( DoGoodFilter.RegExpFilter(link) || clickTag ) return true;
  158.               break;
  159.             case "object":
  160.                   if ( DoGoodFilter.RegExpFilter(link) ) return true;
  161.               break;
  162.             case "iframe":
  163.               if (DoGoodFilter.RegExpFilter(link) && !DoGoodReplace.isDogoodObject(obj.contentWindow.document)) return true;
  164.               break;
  165.             default: return false;  
  166.         }
  167.     },
  168.     
  169.     /**
  170.      * Function for get parent object for current object
  171.      *
  172.      * @param {object} obj - current object  
  173.      * @param {string} type - type of objects
  174.      */
  175.     getObjectAndParent : function(obj, type) {
  176.         var pr = obj.parentNode;
  177.         if ((type == "embed") && (obj.parentNode.tagName.toLowerCase() == 'object')) {
  178.             pr = pr.parentNode;
  179.             obj = obj.parentNode;
  180.         }
  181.         return { obj: obj, pr: pr }
  182.     },
  183.     
  184.     /**
  185.      * Create new image and link objects
  186.      *
  187.      * @param {object} doc - current loaded document
  188.      * @param {object} obj - current object
  189.      * @param {object} pr -  parrent object            
  190.      * @param {string} type - type of objects     
  191.      * @param {int} w - width of object
  192.      * @param {int} h - height of object
  193.      */
  194.     createBanner : function(doc, obj, pr, type, w, h) {
  195.         if ((type == 'iframe') || (type == 'image')) { 
  196.             var newA = doc.createElement("a");
  197.             newA.setAttribute("href", "");
  198.             newA.setAttribute("target", "_blank");
  199.             pr.appendChild(newA);
  200.             pr.insertBefore(newA,obj);
  201.                             
  202.             var newImage = doc.createElement("img");
  203.             newImage.setAttribute("src", "");
  204.             newImage.setAttribute("alt", "");
  205.             newImage.setAttribute("width", 0);
  206.             newImage.setAttribute("height", 0);
  207.             newImage.setAttribute("border", 0);
  208.             newA.appendChild(newImage);
  209.                             
  210.             newA.backsrc = obj;
  211.             newA.backw = w;
  212.             newA.backh = h;
  213.             newImage.setAttribute("id", "DoGoodObject");
  214.             DoGoodReplace.replaceAll(newA, newImage);
  215.         } else {
  216.             var newObj = doc.createElement("object");
  217.             newObj.setAttribute("id", "DoGoodObject");
  218.             newObj.setAttribute("width", 0);
  219.             newObj.setAttribute("height", 0);
  220.             newObj.setAttribute("codebase", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0");
  221.             pr.appendChild(newObj);
  222.             pr.insertBefore(newObj, obj);
  223.                             
  224.             var newEmbed = doc.createElement("embed");
  225.             newEmbed.setAttribute("src", "");
  226.             newEmbed.setAttribute("width", 0);
  227.             newEmbed.setAttribute("height", 0);
  228.             newEmbed.setAttribute("pluginspace","HTTP://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash");
  229.             newEmbed.setAttribute("type", "application/x-shockwave-flash");
  230.             newEmbed.setAttribute("quality", "high");
  231.             newEmbed.setAttribute("allowscriptaccess", "never");
  232.             newObj.appendChild(newEmbed);
  233.                             
  234.             newObj.backsrc = obj;
  235.             newObj.backw = w;
  236.             newObj.backh = h;
  237.             DoGoodReplace.replaceAll(newObj, newEmbed, type);
  238.         }
  239.         
  240.         var loc = doc.location.href;
  241.     },
  242.  
  243.     /**
  244.      * Replace src of image and href of link
  245.      *
  246.      * @param {object} a - link of banner
  247.      * @param {object} img - image of banner
  248.      */
  249.     replaceAll : function(a, img, type) {
  250.         var w = a.backw;
  251.         var h = a.backh;
  252.         var iname = w + "x" + h;
  253.         var rnd = new Date().getTime();
  254.         
  255.         //code for tracking repeat banners
  256.         if (DoGoodRules.newimages[iname][1] == -1) {
  257.             DoGoodRules.newimages[iname][1] = Math.floor((19)*Math.random()) + 1;
  258.         } else {
  259.             if (DoGoodRules.newimages[iname][1] < 20) {
  260.                 DoGoodRules.newimages[iname][1]++;
  261.             } else {
  262.                 DoGoodRules.newimages[iname][1] = 1;
  263.             }
  264.         }
  265.         
  266.         if ((type == "embed") || (type == "object")) {
  267.             
  268.             //set src for server swf
  269.             img.setAttribute("src", DoGoodReplace.adsserver + "session/" + DoGoodReplace.sessionId + "rnd" + rnd + "swf" + DoGoodRules.newimages[iname][1] + "size" + iname + "/");
  270.             
  271.             //set link in clickTAD parameter
  272.             img.setAttribute("flashvars", "clickTAG=" + DoGoodReplace.adsserver + "session/" + DoGoodReplace.sessionId + "rnd" + rnd + "swf" + DoGoodRules.newimages[iname][1] + "hrefsize" + iname + "/");
  273.             img.width = w;
  274.             img.height = h;
  275.             a.width = w;
  276.             a.height = h;
  277.         } else {
  278.             a.target = "_blank";
  279.  
  280.             //set link for server script
  281.             a.setAttribute("href",DoGoodReplace.adsserver + "session/" + DoGoodReplace.sessionId + "rnd" + rnd + "img" + DoGoodRules.newimages[iname][1] + "hrefsize" + iname + "/");
  282.             
  283.             //set src for server script
  284.             img.setAttribute("src", DoGoodReplace.adsserver + "session/" + DoGoodReplace.sessionId + "rnd" + rnd + "img" + DoGoodRules.newimages[iname][1] + "size" + iname + "/");
  285.                 
  286.             img.width = w;
  287.             img.height = h;
  288.         }
  289.         
  290.         a.backsrc.parentNode.removeChild(a.backsrc);
  291.  
  292.         DoGoodReplace.currentCount++;
  293.         document.getElementById('status-count').value = DoGoodReplace.currentCount;   //set to bottom right pannel current count
  294.     },
  295.     
  296.     /**
  297.      * Function to check the availability of replacements in the document
  298.      *
  299.      * @param {object} doc - current document     
  300.      */
  301.     isDogoodObject : function(doc) {
  302.         if (doc.getElementById('DoGoodObject')) return true;
  303.         
  304.         var iframes = doc.getElementsByTagName("iframe");
  305.         for (var k=0;k<iframes.length;k++) { 
  306.             if (iframes[k].contentWindow.document.getElementById('DoGoodObject')) {
  307.                 return true;
  308.                 DoGoodReplace.isDogoodObject(iframes[k].contentWindow.document);
  309.             }
  310.         }
  311.         return false;
  312.     },
  313.  
  314.     /**
  315.      * Function for check site ignore and start replace
  316.      *
  317.      * @param {object} doc - current loaded document  
  318.      */
  319.     startReplace : function(doc) {
  320.  
  321.         if (!doc) doc = window.content.document;
  322.         var loc = doc.location.href;
  323.         var rootDoc = doc;
  324.         if (doc.defaultView.frameElement) {
  325.             rootDoc = doc.defaultView.top.document;
  326.             loc = rootDoc.location.href;
  327.         }
  328.         
  329.         if (!DoGoodCookie.isIgnore(loc, rootDoc)) {
  330.             DoGoodReplace.imageBannersSearch(doc);
  331.         }
  332.     }
  333. };
  334.  
  335. /**
  336.  * Class DoGoodLoad.
  337.  * Contains methods for initializing addon
  338.  */
  339. var DoGoodLoad = {
  340.  
  341.     init: function() {
  342.           var appcontent = document.getElementById("appcontent");     
  343.           if(appcontent) {                                //if browser is ready, set DOMContentLoaded event
  344.               appcontent.addEventListener("DOMContentLoaded", DoGoodLoad.onPageLoad, true);
  345.               //DoGoodLoad.checkVersion();
  346.           }
  347.       },
  348.       
  349.       onPageLoad: function(aEvent) { 
  350.           
  351.           //reading cookie and redirect on thank you page
  352.         if ((DoGoodCookie.readCookie('DoGood_version') == DoGoodReplace.version) && (DoGoodCookie.readCookie('DoGood_redirect') == 'no')) {
  353.             DoGoodCookie.createCookie('DoGood_redirect','yes',365);
  354.             gBrowser.selectedTab = gBrowser.addTab(DoGoodReplace.faceserver+"thanks/");
  355.         }
  356.         
  357.         //init context menu elements
  358.         if (!DoGoodContextMenu.context_menu) {
  359.             DoGoodContextMenu.context_menu_showorigall = document.getElementById('context-dogood-showorigall');
  360.             DoGoodContextMenu.context_menu_report = document.getElementById('context-dogood-report');
  361.             DoGoodContextMenu.context_menu_ignoreon = document.getElementById('context-dogood-ignoreon');
  362.             DoGoodContextMenu.context_menu_ignoreoff = document.getElementById('context-dogood-ignoreoff');
  363.             DoGoodContextMenu.context_menu = document.getElementById("contentAreaContextMenu");
  364.             DoGoodContextMenu.context_menu.addEventListener("popupshowing", DoGoodContextMenu.DoGoodContextOn, true);
  365.         }
  366.         
  367.         //init toolbar elements
  368.         if (document.getElementById('toolbarContextMenu') && !DoGoodContextMenu.toolbar_menu) {
  369.             DoGoodContextMenu.toolbar_menu = document.getElementById('toolbarContextMenu'); 
  370.             DoGoodContextMenu.toolbar_menu_showorigall = document.getElementById('toolbar-dogood-showorigall'); 
  371.             DoGoodContextMenu.toolbar_menu_ignoreon = document.getElementById('toolbar-dogood-ignoreon');
  372.             DoGoodContextMenu.toolbar_menu_ignoreoff = document.getElementById('toolbar-dogood-ignoreoff');
  373.             DoGoodContextMenu.toolbar_menu.addEventListener("popupshowing", DoGoodContextMenu.DoGoodToolbarAction, true);
  374.         } 
  375.  
  376.         //if server is not down, begin replacing
  377.         if (DoGoodFilter.filtersText) {
  378.             var doc = aEvent.originalTarget;
  379.             DoGoodReplace.startReplace(doc);
  380.         }
  381.       },
  382.   
  383.     tabSelected : function(aEvent) { 
  384.     },
  385.     
  386.     windowClose : function(aEvent) { 
  387.         var xmlhttp = DoGoodFilter.getXmlHttp();
  388.         xmlhttp.open('GET', DoGoodReplace.adsserver+'server/clearcache/?sessionId='+DoGoodReplace.sessionId, true);
  389.         xmlhttp.send(null);
  390.     },
  391.     
  392.     checkVersion : function() {
  393.         if (!DoGoodCookie.readCookie('DoGooderIsUpdate')) {
  394.             var xmlhttp = DoGoodFilter.getXmlHttp();
  395.             xmlhttp.open('GET', DoGoodReplace.faceserver+'server/checkversion/?browser=firefox', true);
  396.             xmlhttp.onreadystatechange = function() {
  397.                   if (xmlhttp.readyState == 4) {
  398.                     if(xmlhttp.status == 200) {
  399.                         var req_version = xmlhttp.responseText;
  400.                         if (req_version && (DoGoodReplace.version != req_version)) {
  401.                             gBrowser.selectedTab = gBrowser.addTab(DoGoodReplace.faceserver+"updatenow/");
  402.                         }
  403.                     }
  404.                   }
  405.             };
  406.             xmlhttp.send(null);
  407.             DoGoodCookie.createCookie('DoGooderIsUpdate','yes', 1);
  408.         }
  409.     }
  410. }
  411.  
  412. DoGoodFilter.getFilters();
  413. window.addEventListener("load", function() { DoGoodLoad.init(); }, false);
  414. window.addEventListener("unload", function() { DoGoodLoad.windowClose(); }, false);